<?php
/**
 * 任务调度
 * @Author   Wcj
 * @email 1054487195@qq.com
 * @DateTime 2019/7/17 17:28
 */

namespace app\index\job;

use think\Log;
use think\queue\Job;
//use PHPMailer\Mail;
use think\Exception;

class sendActivationMail
{
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param $data [发布任务时自定义的数据
     */
    public function fire(Job $job, $data)
    {
        //有效消息到达消费者时可能已经不再需要执行了
        if (!$this->checkJob($data)) {
            $job->delete();
            return;
        }

        //如果执行成功, 就删除队列
        if ($this->doJob($data)) {
            Log::record('The job has been closed and deleted' . PHP_EOL);
            $job->delete();
        } else {
            //如果执行到这里的话 说明队列执行失败  如果失败三次就删除该任务  否则重新执行
            Log::record('Task execution failed' . PHP_EOL);
            if ($job->attempts() > 3) {
                Log::record('Dismiss job has been retried more that 3 times' . PHP_EOL);
                $job->delete();
            } else {
                Log::record("Redo a task" . $job->attempts() . "times" . PHP_EOL);
                $job->release(); //重发任务
            }
        }
    }

    /**
     * 发送邮件
     * @param $data
     * @return bool
     */
    private function sendMail($data)
    {
        $title = '账号激活邮件';
        $msg = '欢迎您注册xxx网站,您的请点击一下连接激活您的账号!....';
        try {
            return Mail::send($title, $msg, $data['email']);
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * 消息在到达消费者时可能已经不需要执行了
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean 任务执行的结果
     */
    private function checkJob($data)
    {
        // 这里写检测逻辑
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理
     */
    private function doJob($data)
    {
//        //执行发送邮件
//        return $this->sendMail($data);

        // 模拟任务执行5秒时间
        sleep(5);

        // 实际业务流程处理
        return true;
    }
}